通过观察 @Enable*
注解的源码,可以发现所有的注解都有一个 @Import
注解。
@Import
注解是用来导入配置类的,这也就是说这些自动开启的实现其实是导入了一些自动配置的 Bean。
@Import 注解导入配置方式的三种类型
1. 直接导入配置类
1 | ({ElementType.TYPE}) |
直接导入配置类 SchedulingConfiguration
,这个类注解了 @Configuration
,且注册了一个 scheduledAnnotationProcessor
的 Bean。
2. 依据条件选择配置类
1 | (ElementType.TYPE) |
AsyncConfigurationSelector
通过条件来选择需要导入的配置类,AsyncConfigurationSelector
的根接口为 ImportSelector
,这个接口需要重写 selectImports
方法,在此方法内进行事先条件判断。若 adviceMode
为 PORXY
,则返回 ProxyAsyncConfiguration
这个配置类;若 activeMode
为 ASPECTJ
,则返回 AspectJAsyncConfiguration
配置类,源码如下:
1 | public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> { |
3. 动态注册 Bean
1 | (ElementType.TYPE) |
AspectJAutoProxyRegistrar
实现了 ImportBeanDefinitionRegistrar
接口,ImportBeanDefinitionRegistrar
的作用是在运行时自动添加 Bean 到已有的配置类,通过重写方法:
1 | public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) |
其中,AnnotationMetadata
参数用来获得当前配置类上的注解;BeanDefinittionRegistry
参数用来注册 Bean。源码如下:
1 | class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar { |